package encryption;

import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;

/**
 * 加密解密工具类(对字符串加密) 需要jdk1.8及以上版本
 * 包含四种加密算法：MD5，RSA，DES，AES
 * 1.MD5加密
 * 2.RSA的加密
 * 3.RSA的解密
 * 4.DES的加密
 * 5.DES的解密
 * 6.AES的加密
 * 7.AES的解密
 */
public class encryptionUtils {
    //加密测试
    public static void main(String[] args) {

    }

    /**
     * 1.MD5加密算法使用 对字符串加密(MD5不可逆，所以没有解密代码，网上已经有破解MD5的网站)
     *
     * @param info 参数为需要加密的String
     * @return 返回加密后的String
     */
    public String getMD5Code(String info) {
        try {
            MessageDigest md5 = MessageDigest.getInstance("MD5");
            md5.update(info.getBytes("utf-8"));//设置编码格式
            byte[] encryption = md5.digest();
            StringBuffer stringBuffer = new StringBuffer();
            for (int i = 0; i < encryption.length; i++) {
                if (Integer.toHexString(0xff & encryption[i]).length() == 1) {
                    stringBuffer.append("0").append(Integer.toHexString(0xff & encryption[i]));
                } else {
                    stringBuffer.append(Integer.toHexString(0xff & encryption[i]));
                }
            }
            return stringBuffer.toString();
        } catch (Exception e) {
            return "MD5加密异常";//getInstance getBytes 两者使用不当会抛出异常
        }
    }

    /**
     * 2.RSA加密算法使用 对字符串解密
     *
     * @param info 参数为需要加密的String
     * @return 返回加密后的String
     */
    public String getRSACode(String info) {
        final Base64.Encoder encoder = Base64.getEncoder();
        final byte[] textByte;
        try {
            textByte = info.getBytes("UTF-8");
            final String encodedText = encoder.encodeToString(textByte);
            return encodedText;
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            return "RSA加密异常";
        }


    }

    /**
     * 3.RSA加密算法使用 对字符串解密
     *
     * @param info 参数为需要加密的String
     * @return 返回解密后的String
     */
    public String decipheringRSA(String info) {
        final Base64.Decoder decoder = Base64.getDecoder();
        try {
            return new String(decoder.decode(info), "UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            return "RSA解密异常";
        }
    }


//4.AES算法（推荐使用）
//1.AES：高级数据加密标准，能够有效抵御已知的针对DES算法的所有攻击
//2.特点：密钥建立时间短、灵敏性好、内存需求低、安全性高

}
